/// Output directory for rust dependencies
pub deps_output: Path,
+
+ /// Extra environment variables that were passed to compilations and should
+ /// be passed to future invocations of programs.
+ pub extra_env: HashMap<String, Option<String>>,
}
impl Compilation {
deps_output: Path::new("/"),
tests: Vec::new(),
binaries: Vec::new(),
+ extra_env: HashMap::new(),
}
}
search_path.push(self.root_output.clone());
search_path.push(self.deps_output.clone());
let search_path = os::join_paths(search_path.as_slice()).unwrap();
- util::process(cmd).env(DynamicLibrary::envvar(),
- Some(search_path.as_slice()))
+ let mut cmd = util::process(cmd).env(DynamicLibrary::envvar(),
+ Some(search_path.as_slice()));
+ for (k, v) in self.extra_env.iter() {
+ cmd = cmd.env(k.as_slice(), v.as_ref().map(|s| s.as_slice()));
+ }
+ return cmd;
}
}
use std::collections::{HashMap, HashSet};
use std::str;
+use semver::Version;
use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target};
use util;
self.compilation.root_output = self.layout(KindTarget).proxy().dest().clone();
self.compilation.deps_output = self.layout(KindTarget).proxy().deps().clone();
- Ok(())
+ let env = &mut self.compilation.extra_env;
+ env.insert("CARGO_PKG_VERSION_MAJOR".to_string(),
+ Some(pkg.get_version().major.to_string()));
+ env.insert("CARGO_PKG_VERSION_MINOR".to_string(),
+ Some(pkg.get_version().minor.to_string()));
+ env.insert("CARGO_PKG_VERSION_PATCH".to_string(),
+ Some(pkg.get_version().patch.to_string()));
+ env.insert("CARGO_PKG_VERSION_PRE".to_string(),
+ pre_version_component(pkg.get_version()));
+
+ return Ok(());
+
+ fn pre_version_component(v: &Version) -> Option<String> {
+ if v.pre.is_empty() {
+ return None;
+ }
+
+ let mut ret = String::new();
+
+ for (i, x) in v.pre.iter().enumerate() {
+ if i != 0 { ret.push_char('.') };
+ ret.push_str(x.to_string().as_slice());
+ }
+
+ Some(ret)
+ }
}
fn build_requirements(&mut self, pkg: &'a Package, target: &'a Target,
use std::dynamic_lib::DynamicLibrary;
use std::io::{fs, UserRWX};
use std::os;
-use semver::Version;
use core::{SourceMap, Package, PackageId, PackageSet, Target, Resolve};
-use util;
use util::{CargoResult, ProcessBuilder, CargoError, human, caused_human};
use util::{Config, internal, ChainError, Fresh, profile};
search_path.push(cx.layout(KindPlugin).deps().clone());
let search_path = os::join_paths(search_path.as_slice()).unwrap();
- util::process(cmd)
- .cwd(pkg.get_root())
- .env(DynamicLibrary::envvar(), Some(search_path.as_slice()))
- .env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string()))
- .env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string()))
- .env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string()))
- .env("CARGO_PKG_VERSION_PRE", pre_version_component(pkg.get_version()))
-}
-
-fn pre_version_component(v: &Version) -> Option<String> {
- if v.pre.is_empty() {
- return None;
- }
-
- let mut ret = String::new();
-
- for (i, x) in v.pre.iter().enumerate() {
- if i != 0 { ret.push_char('.') };
- ret.push_str(x.to_string().as_slice());
- }
-
- Some(ret)
+ // We want to use the same environment and such as normal processes, but we
+ // want to override the dylib search path with the one we just calculated.
+ cx.compilation.process(cmd).cwd(pkg.get_root())
+ .env(DynamicLibrary::envvar(),
+ Some(search_path.as_slice()))
}
+2014-08-06
+ linux-i386 eb7c2a87b30db077f6f1c4ea724ebd0e5cc07d1c
+ linux-x86_64 1672657adb9012df2912bbb2f43466f1c6817e55
+ macos-i386 1224207bbfa9f46796940512ac8a7a9ab9f5665b
+ macos-x86_64 da4afea32d7336a0a91b8fe160d38896385d4ae2
+ winnt-i386 2b6b2efe9ec77d3d456c943bb2e54f2281309ef1
+
2014-08-04
linux-i386 49032ce8c5c2b94d73e298dcbdb09e0b2fbe573c
linux-x86_64 98c83ecc7cac3765d62f5e8b19bdc506e01f3cab
let p = project("foo")
.file("Cargo.toml", r#"
[project]
-
name = "foo"
version = "0.5.1-alpha.1"
authors = ["wycats@example.com"]
-
- [[bin]]
- name = "foo"
"#)
- .file("src/foo.rs", r#"
- use std::os;
+ .file("src/main.rs", r#"
+ extern crate foo;
static VERSION_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR");
static VERSION_MINOR: &'static str = env!("CARGO_PKG_VERSION_MINOR");
static VERSION_PRE: &'static str = env!("CARGO_PKG_VERSION_PRE");
fn main() {
- println!("{}-{}-{} @ {}",
- VERSION_MAJOR,
- VERSION_MINOR,
- VERSION_PATCH,
- VERSION_PRE);
+ let s = format!("{}-{}-{} @ {}", VERSION_MAJOR, VERSION_MINOR,
+ VERSION_PATCH, VERSION_PRE);
+ assert_eq!(s, foo::version());
+ println!("{}", s);
+ }
+ "#)
+ .file("src/lib.rs", r#"
+ pub fn version() -> String {
+ format!("{}-{}-{} @ {}",
+ env!("CARGO_PKG_VERSION_MAJOR"),
+ env!("CARGO_PKG_VERSION_MINOR"),
+ env!("CARGO_PKG_VERSION_PATCH"),
+ env!("CARGO_PKG_VERSION_PRE"))
}
"#);
assert_that(
process(p.bin("foo")),
execs().with_stdout("0-5-1 @ alpha.1\n"));
+
+ assert_that(p.process(cargo_dir().join("cargo-test")), execs().with_status(0));
})
test!(custom_build_in_dependency {